package object2;

import java.lang.Override;

/**
 * Object类 toString()方法
 */
public class ToString {

    public static void main(String[] args) {
        /*
            默认返回：全类名+@+哈希值的十六进制
            1)子类往往重写toString方法，用于返回对象的属性信息
            2)当直接输出一个对象时，toString()会被默认调用
         */

        Monster monster = new Monster("黑熊精", "巡山", 1000);
        System.out.println(monster.toString() + "，hashcode=" + monster.hashCode());


        Monster monster1 = new Monster("黄眉", "巡山", 10000);
        //此时monster1对象就是一个垃圾，则会被系统视为垃圾待回收
        monster1 = null;
        //在销毁对象前，会调用该对象的finalize方法
        System.gc();
    }
}

class Monster {

    private String name;

    private String job;

    private double sal;

    public Monster(String name, String job, double sal) {
        this.name = name;
        this.job = job;
        this.sal = sal;
    }

    //重写toString()，输出对象属性


    @Override
    public String toString() {
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }

    /*
        finalize方法
        当对象被回收时，系统自动调用该对象的 finalize 方法。子类可以重写该方法用于资源释放
        什么时候回收：当某个对象没有任何引用时，则jvm就人文这个对象是一个垃圾对象，就会使用垃圾回收机制销毁该对象，在销毁该对象前会先调用finalize方法
        垃圾回收机制的调用，是由系统来决定（GC）
     */
    @Override
    protected void finalize() throws Throwable {
        System.out.println("fin..");
    }
}
